package pierwszy;


import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

@Test
public class ZleceniaUS {
	static WebDriver driver;
    static WebDriverWait wait;
    
    private String PortalLink = "http://www.bermar2.home.pl/ks_portal/login.php";
    private String login = "p.jaworek";
    private String password = "jawso98*";
    
	private String site = "ks_portal";
	private String iconPlusOptionCheck = "Płatności";
	private String iconPlusOption = "Zobowiązanie wobec US ";   
	private String iloscZlecenUSPrzedUsunieciem = "";
	private String iloscZlecenUSPoUsunieciu = "";
	
	private KsPortalPage KSP;
	
	private Map<String,String> DaneZlecenieUS = new TreeMap<String,String>();
	private Map<String,String> DaneUrzad = new LinkedHashMap<String,String>();
	private Map<String,String> DanePodatek= new LinkedHashMap<String,String>();
	
    @BeforeClass
    void setUp() {
    	System.out.println("Przed klasą");
        driver = new FirefoxDriver();
        wait = new WebDriverWait(driver,10);
        driver.manage().window().maximize();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
		DaneZlecenieUS.put("Klient", "Bermar Firma Test");
		DaneZlecenieUS.put("Rodzaj podatku", "VAT");
		DaneZlecenieUS.put("Płatnik", "Adam Kowalski");
		DaneZlecenieUS.put("Kwartał", "III");
		DaneZlecenieUS.put("Rok", "2014");
		DaneZlecenieUS.put("Kwota", "1234.00 pln");
		DaneZlecenieUS.put("Do kiedy zapłacić", "2014-12-31");
		DaneZlecenieUS.put("Uwagi", "Testowe uwagi do zlecenie US.");
		DaneZlecenieUS.put("Zlecenia", "Czynność niepowiązana");
		DaneZlecenieUS.put("Typ", "kwartalny"); //miesieczny, kwartalny
		DaneZlecenieUS.put("Miesiąc", "12");

    	driver.get(PortalLink);
    }
    
    @AfterClass
    static void tearDown() {
    	System.out.println("Za klasą");
    	//driver.quit();
        //driver.close();
    }
    
    @BeforeMethod
    void setUpTest(){
    	System.out.println("Przed metodą testową");
    }
    
    @AfterMethod
    void tearDownTest(){
    	System.out.println("Za metodą testowa");
    }
    
    @Test
	public void dodajZlecenieUS(){
		
    	//Log in
		LogInPage Login = new LogInPage(driver, wait); 
		MainPage MP = Login.logIn(login,password);
				
		//Choose and Check KsPortal site	
		KSP = MP.chooseSite(site);
		
		//Check if KsPortal was chosen.
		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.passSelectedSite(site)));
		assert driver.findElement(UiMapping.passSelectedSite(site)).getText().trim().equals(site) : "Site " + site + " was not chosen.";
		
		//Choose and Check IconPlusOption (Employee)	
		KSP.getOptionFromIconPlus(iconPlusOption);
				
		//Check if Employee option was chosen.
		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.IconPlusCheck));
		assert driver.findElement(UiMapping.IconPlusCheck).getText().equals(iconPlusOptionCheck) : "Option " + iconPlusOption + " was not chosen.";

//		//Fill in commission translation form
		KSP.wypelnijZlecenieUS(DaneZlecenieUS);

		//Submit commission translation form
		KSP.dodajZlecenieUS();
	}
    
    @Test (dependsOnMethods = "dodajZlecenieUS") 
    public void sprawdzZlecenieUS(){
		//Check ZlecenieUS
		assert KSP.sprawdzPolaZleceniaUS(DaneZlecenieUS): "US Commission saved and stored data is different!";
    }
    
    @Test(dependsOnMethods = "sprawdzZlecenieUS")
    public void sprawdzOstatnieZlecenieUS(){
    	KSP.znajdzOstatnieZlecenieSkladke("ZlecenieUS");	
		assert KSP.sprawdzOstatnieZlecenieUS(DaneZlecenieUS);
		
		iloscZlecenUSPrzedUsunieciem = KSP.pobierzIloscZlecenUsSkladekZus();
    }
    
    @Test (dependsOnMethods = "sprawdzOstatnieZlecenieUS")
    public void usunZlecenieUS(){
		KSP.usunZlecenieUSSkladkeZus(KSP.getTranslationId());
		
		iloscZlecenUSPoUsunieciu = KSP.pobierzIloscZlecenUsSkladekZus();

		assert (Integer.parseInt(iloscZlecenUSPrzedUsunieciem)-Integer.parseInt(iloscZlecenUSPoUsunieciu)==1): "Commission was not deleted!";
    }
    
    @Test(dependsOnMethods = "usunZlecenieUS")
    public void filtrujZleceniaUSPoNazwaFirmy(){
    	String nazwaFirmy = "Bermar NGO Test";
    	String iloscZlecenUSPoFiltracjiFirma = "";
    	Integer iloscZlecenDanejFirmy = 0;
		
   		//Choose and Check IconPlusOption 
   		KSP.getOptionFromIconPlus(iconPlusOption);
    					
  		//Check if Employee option was chosen.
   		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.IconPlusCheck));
    	assert driver.findElement(UiMapping.IconPlusCheck).getText().equals(iconPlusOptionCheck) : "Option " + iconPlusOption + " was not chosen.";

    	//Policz ilsoc zlecen danej firmy wsrod wszystkich zlecen
    	iloscZlecenDanejFirmy = KSP.pobierzIloscZlecenFirmy(nazwaFirmy);	
    	System.out.println("Ilosc zlecen danej firmy: " + iloscZlecenDanejFirmy);
    		
    	//Filtruj po nazwie firmy
    	KSP.filtrujZlecenieUSFirma(nazwaFirmy);
   		assert KSP.sprawdzZleceniaUSPoFiltracjiFirma(nazwaFirmy): "Znaleziono firmy o nazwie innej niż " + nazwaFirmy;
   		iloscZlecenUSPoFiltracjiFirma = KSP.pobierzIloscZlecenUsSkladekZus();
   		System.out.println("Ilosc zlecen danej firmy: " + iloscZlecenUSPoFiltracjiFirma);
    	
   		//Porownaj ilosć zlecen danej firmy przed i po filtracji
    	assert iloscZlecenDanejFirmy == Integer.valueOf(iloscZlecenUSPoFiltracjiFirma): "Liczba zlecen przefiltrowanych jest inna niż liczba wszystkich zlecen danej firmy!";
    }
    
    @Test(dependsOnMethods = "filtrujZleceniaUSPoNazwaFirmy")
    public void dodajNowyUrzad(){
    	String opcja = "[+] Urząd";
    	List<WebElement> znalezioneUrzedy;
    	Boolean flagaZgodnosciPolUrzedu = false;
    	
		DaneUrzad.put("Nazwa", "US Kumki");
		DaneUrzad.put("Numer konta", "1234567890");
		DaneUrzad.put("Miasto", "Kumki city");
		DaneUrzad.put("Kod", "00-000");
		DaneUrzad.put("Ulica", "Kumecka");
		DaneUrzad.put("Telefon", "+48 12 343 33");
		DaneUrzad.put("Fax", "+40 12 343 32");
		DaneUrzad.put("Email", "uskumki@gmail.com");
		DaneUrzad.put("kod IS/US", "00Kumki");

    	//Choose and Check IconPlusOption 
   		KSP.getOptionFromIconPlus(iconPlusOption);
    					
  		//Check if Employee option was chosen.
   		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.IconPlusCheck));
    	assert driver.findElement(UiMapping.IconPlusCheck).getText().equals(iconPlusOptionCheck) : "Option " + iconPlusOption + " was not chosen.";

    	//Wybierz opcje dodaj urzad
    	KSP.wybierzOpcje(opcja);
    	
    	KSP.wypelnijDaneUrzad(DaneUrzad);
    	
    	KSP.dodajUrzad();
    	
    	znalezioneUrzedy = KSP.znajdzUrzadPoNazwie(DaneUrzad);

    	assert znalezioneUrzedy.size() != 0 : "Nie znaleziono urzedow o nazwie" + DaneUrzad.get("Nazwa");
    	
    	for(int i = 0; i < znalezioneUrzedy.size(); i++){
    		znalezioneUrzedy = KSP.znajdzUrzadPoNazwie(DaneUrzad);
    		znalezioneUrzedy.get(i).click();
    		flagaZgodnosciPolUrzedu = KSP.sprawdzPolaUrzedow(znalezioneUrzedy.size(), DaneUrzad);
    		
    		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.powrotBtn));
        	driver.findElement(UiMapping.powrotBtn).click();
        	
    		if(flagaZgodnosciPolUrzedu){
    			break;
    		}
    	}
    	assert flagaZgodnosciPolUrzedu : "Pola wprowadzone i odczytane są niezgodne!";
		
    	KSP.usunUrzad(DaneUrzad);
    	
    }
    
    
    @Test(dependsOnMethods = "dodajNowyUrzad")
    public void dodajNowyTypPodatku(){
    	Integer idOstatniegoPodatku = 0 ;
    	String opcja = "[+] Kategorię podatku";

		DanePodatek.put("Nazwa", "Akcyza");
		DanePodatek.put("Opis", "Przykładowy opis nowego podatku akcyza.");
    	
    	//Choose and Check IconPlusOption 
   		KSP.getOptionFromIconPlus(iconPlusOption);
    					
  		//Check if Employee option was chosen.
   		wait.until(ExpectedConditions.presenceOfElementLocated(UiMapping.IconPlusCheck));
    	assert driver.findElement(UiMapping.IconPlusCheck).getText().equals(iconPlusOptionCheck) : "Option " + iconPlusOption + " was not chosen.";

    	//Wybierz opcje dodaj urzad
    	KSP.wybierzOpcje(opcja);
    	
    	KSP.wypelnijDanePodatku(DanePodatek);
    	
    	KSP.dodajNowyPodatek();
    	
    	idOstatniegoPodatku = KSP.znajdzOstatniNowyPodatek();
    	
    	assert KSP.sprawdzOstatniPodatek(idOstatniegoPodatku, DanePodatek) : "Dane wpisane i odczytane są różne!";
    	
    	assert KSP.sprawdzOstatniPodatekWszystkiePola(idOstatniegoPodatku, DanePodatek) : "Dane wpisane i odczytane są różne!";
    	
    	KSP.usunPodatek();
    	
    	assert KSP.znajdzOstatniNowyPodatek() != idOstatniegoPodatku : "Podatek nie został usunięty!";
    }
    
    @Test (dependsOnMethods = "dodajNowyTypPodatku")
    public void checkCookies() throws InterruptedException{
    	Utils UTL = new Utils(driver, wait);
    	
    	//driver.manage().deleteAllCookies();
    	
  		driver.get("https://www.facebook.com");
  	  	
  		UTL.gmailLogin("wojciech.pulawski@gmail.com", "Sm028xf?");
  		
  		Thread.sleep(10000);
  		
  		UTL.storeCookies();
    }
}